package com.guilin.system.service.impl;

import java.util.*;
import java.util.stream.Collectors;

import com.alibaba.fastjson2.JSON;
import com.guilin.common.constant.Constants;
import com.guilin.common.exception.ServiceException;
import com.guilin.common.utils.DateUtils;
import com.guilin.common.utils.StringUtils;
import com.guilin.domain.SurveyQuestion;
import com.guilin.system.service.SurveyQuestionService;
import com.guilin.vo.SurveyQuestionnaireDetailVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.guilin.mapper.SurveyQuestionnaireMapper;
import com.guilin.domain.SurveyQuestionnaire;
import com.guilin.system.service.SurveyQuestionnaireService;

/**
 * 问卷Service业务层处理
 * 
 * @author xiaoqi
 * @date 2025-06-24
 */
@Service
@Slf4j
public class SurveyQuestionnaireServiceImpl implements SurveyQuestionnaireService
{
    @Autowired
    private SurveyQuestionnaireMapper surveyQuestionnaireMapper;

    @Autowired
    private SurveyQuestionService surveyQuestionService;
    /**
     * 查询问卷
     * 
     * @param id 问卷主键
     * @return 问卷
     */
    @Override
    public SurveyQuestionnaire selectSurveyQuestionnaireById(Long id)
    {
        return surveyQuestionnaireMapper.selectSurveyQuestionnaireById(id);
    }

    /**
     * 查询问卷列表
     * 
     * @param surveyQuestionnaire 问卷
     * @return 问卷
     */
    @Override
    public List<SurveyQuestionnaire> selectSurveyQuestionnaireList(SurveyQuestionnaire surveyQuestionnaire)
    {
        return surveyQuestionnaireMapper.selectSurveyQuestionnaireList(surveyQuestionnaire);
    }

    /**
     * 新增问卷
     * 
     * @param surveyQuestionnaire 问卷
     * @return 结果
     */
    @Override
    public int insertSurveyQuestionnaire(SurveyQuestionnaire surveyQuestionnaire)
    {
        surveyQuestionnaire.setCreateTime(DateUtils.getNowDate());
        return surveyQuestionnaireMapper.insertSurveyQuestionnaire(surveyQuestionnaire);
    }

    /**
     * 修改问卷
     * 
     * @param surveyQuestionnaire 问卷
     * @return 结果
     */
    @Override
    public int updateSurveyQuestionnaire(SurveyQuestionnaire surveyQuestionnaire)
    {
        surveyQuestionnaire.setUpdateTime(DateUtils.getNowDate());
        return surveyQuestionnaireMapper.updateSurveyQuestionnaire(surveyQuestionnaire);
    }

    /**
     * 批量删除问卷
     * 
     * @param ids 需要删除的问卷主键
     * @return 结果
     */
    @Override
    public int deleteSurveyQuestionnaireByIds(Long[] ids)
    {
        return surveyQuestionnaireMapper.deleteSurveyQuestionnaireByIds(ids);
    }

    /**
     * 删除问卷信息
     * 
     * @param id 问卷主键
     * @return 结果
     */
    @Override
    public int deleteSurveyQuestionnaireById(Long id)
    {
        return surveyQuestionnaireMapper.deleteSurveyQuestionnaireById(id);
    }


    /**
     * 发布问卷
     * @param id
     */
    public void publishSurveyQuestionnaire(Long id) {

        // 查询问卷
        SurveyQuestionnaire surveyQuestionnaire = surveyQuestionnaireMapper.selectSurveyQuestionnaireById(id);

        // 判断问卷是否存在
        if (surveyQuestionnaire == null) {
            throw new ServiceException("问卷不存在，无法发布");
        }

        // 判断问卷是否为发布状态
        if(surveyQuestionnaire.getStatus() != null && surveyQuestionnaire.getStatus().equals(Constants.SURVEY_ONE)) {
            throw new ServiceException("问卷已经发布，无法再次发布");
        }

        // 发布问卷
        surveyQuestionnaire.setId(id);
        surveyQuestionnaire.setStatus(Constants.SURVEY_ONE);
        surveyQuestionnaire.setStartTime(DateUtils.getNowDate());

        // 更新问卷
        if (surveyQuestionnaireMapper.updateSurveyQuestionnaire(surveyQuestionnaire) < 0) {
            throw new ServiceException("问卷发布失败");
        }

    }


    /**
     * 获取问卷详情及关联题目
     * @param questionnaireId
     * @return
     */
    @Override
    public SurveyQuestionnaireDetailVO selectQuestionnaireWithQuestions(Long questionnaireId) {
        // 1. 获取问卷基本信息
        SurveyQuestionnaire questionnaire = surveyQuestionnaireMapper.selectSurveyQuestionnaireById(questionnaireId);
        if (questionnaire == null) {
            throw new ServiceException("问卷不存在");
        }

        // 2. 验证问卷状态是否为已发布
        if (!Constants.SURVEY_ONE.equals(questionnaire.getStatus())) {
            throw new ServiceException("问卷未发布，无法填写");
        }

        // 3. 构建VO对象
        SurveyQuestionnaireDetailVO detailVO = new SurveyQuestionnaireDetailVO();
        detailVO.setId(questionnaire.getId());
        detailVO.setQuestionnaireName(questionnaire.getQuestionnaireName());
        detailVO.setDuration(questionnaire.getDuration());
        detailVO.setClosingMessage(questionnaire.getClosingMessage());
        detailVO.setStatus(questionnaire.getStatus());
        detailVO.setStartTime(questionnaire.getStartTime());
        detailVO.setEndTime(questionnaire.getEndTime());

        // 4. 查询关联题目
        SurveyQuestion questionQuery = new SurveyQuestion();
        questionQuery.setQuestionnaireId(questionnaireId);
        List<SurveyQuestion> questions = surveyQuestionService.selectSurveyQuestionList(questionQuery);

        // 5. 转换为题目详情VO
        List<SurveyQuestionnaireDetailVO.QuestionDetailVO> questionVOs = questions.stream()
                .map(q -> {
                    SurveyQuestionnaireDetailVO.QuestionDetailVO vo = new SurveyQuestionnaireDetailVO.QuestionDetailVO();
                    vo.setId(q.getId());
                    vo.setQuestionnaireId(q.getQuestionnaireId());
                    vo.setQuestionText(q.getQuestionText());
                    vo.setQuestionType(q.getQuestionType());
                    vo.setSortOrder(q.getSortOrder());
                    vo.setRequired(q.getIsRequired() == 1);
                    vo.setInputType(q.getInputType());
                    vo.setMaxLength(q.getMaxLength());
                    vo.setCreateTime(q.getCreateTime());
                    vo.setUpdateTime(q.getUpdateTime());

                    // 解析逗号分隔的选项
                    if (StringUtils.isNotBlank(q.getOptions())) {
                        // 按逗号分割字符串
                        String[] optionArray = q.getOptions().split(",");
                        // 转换为前端需要的选项格式（value和label）
                        List<Map<String, String>> options = Arrays.stream(optionArray)
                                .map(option -> {
                                    Map<String, String> opt = new HashMap<>();
                                    opt.put("value", option);
                                    opt.put("label", option);
                                    return opt;
                                })
                                .collect(Collectors.toList());
                        vo.setOptions(options);
                    } else {
                        vo.setOptions(Collections.emptyList());
                    }
                    return vo;
                })
                .sorted(Comparator.comparing(SurveyQuestionnaireDetailVO.QuestionDetailVO::getSortOrder).reversed())
                .collect(Collectors.toList());

        detailVO.setQuestions(questionVOs);
        return detailVO;
    }
}
